/**
 * @see https://umijs.org/zh-CN/plugins/plugin-access
 */
export default function access(initialState: { currentUser?: API.CurrentUser } | undefined) {
  const { currentUser } = initialState ?? {};
  const menuAuthList = currentUser?.menuAuthList || [];

  /**
   * 判断用户是否有某个菜单的权限，支持递归子菜单
   * @param menuCode {string} 当前路由的 menuCode
   * @param menuList {API.Menu[]} 当前用户的菜单权限列表
   * @returns {boolean} 是否有访问权限
   */
  const hasMenuCode = (menuCode: string, menuList: API.Menu[] | undefined): boolean => {
    if (!menuCode || !menuList) return false;

    // 检查该 menuCode 是否在用户的权限列表中
    const menu = menuList.find(menu => menu.menuCode === menuCode);
    if (menu) {
      return true; // 如果直接找到该菜单项，则说明有权限
    }

    // 递归检查父菜单权限
    for (const menuItem of menuList) {
      // 如果当前菜单项有子菜单，递归查找
      if (menuItem.treeList && menuItem.treeList.length > 0) {
        if (hasMenuCode(menuCode, menuItem.treeList)) {
          return true; // 如果找到该菜单的子菜单，也放开权限
        }
      }
    }
    return false; // 如果遍历所有菜单都没有找到该权限，则返回 false
  };

  return {
    /**
     * 判断是否有特定权限
     * @param route {object} 当前路由配置
     */
    canAccessMenu: (route: { menuCode?: string }) => {
      if (!route.menuCode) {
        return true; // 如果路由没有配置 menuCode，则默认允许访问
      }
      return hasMenuCode(route.menuCode, menuAuthList);
    },
  };
}
